package utils

import (
	"database/sql/driver"
	"fmt"
	"time"
)

// JSONTime 是为JSON序列化而定制的时间类型
type JSONTime time.Time

// MarshalJSON 实现json.Marshaler接口
func (t JSONTime) MarshalJSON() ([]byte, error) {
	stamp := fmt.Sprintf("\"%s\"", FormatTime(time.Time(t)))
	return []byte(stamp), nil
}

// UnmarshalJSON 实现json.Unmarshaler接口
func (t *JSONTime) UnmarshalJSON(data []byte) error {
	if string(data) == "null" {
		return nil
	}

	// 去除引号
	timeStr := string(data)
	timeStr = timeStr[1 : len(timeStr)-1]

	parsedTime, err := ParseTime(timeStr)
	if err != nil {
		return err
	}
	*t = JSONTime(parsedTime)
	return nil
}

// Value 实现driver.Valuer接口
func (t JSONTime) Value() (driver.Value, error) {
	return time.Time(t), nil
}

// Scan 实现sql.Scanner接口
func (t *JSONTime) Scan(value interface{}) error {
	if value == nil {
		*t = JSONTime(time.Time{})
		return nil
	}

	switch v := value.(type) {
	case time.Time:
		*t = JSONTime(v)
		return nil
	case []byte:
		parsedTime, err := ParseTime(string(v))
		if err != nil {
			return err
		}
		*t = JSONTime(parsedTime)
		return nil
	case string:
		parsedTime, err := ParseTime(v)
		if err != nil {
			return err
		}
		*t = JSONTime(parsedTime)
		return nil
	}

	return fmt.Errorf("无法将 %T 转换为 JSONTime", value)
}

// String 转换为字符串
func (t JSONTime) String() string {
	return FormatTime(time.Time(t))
}

// Time 转换为time.Time类型
func (t JSONTime) Time() time.Time {
	return time.Time(t)
}
